<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>let</title>
</head>
<body>
    <script>
        // let声明变量
        let a;
        let b,c,d;
        let e = 100;
        let f = 110,g = 'qwe',h = [];

        // let声明变量的特性s

        // 1.不能重复声明
        // let star = '罗志祥';
        // let star = "小猪" //error
 
        // 2.块级作用域     全局|函数|eval
        // {
        //     let girl = '小红';
        //     // var没有块级作用域 可以读取到
        // }
        // console.log(girl);//error|Uncaught ReferenceError: girl is not defined

        // 3.不存在变量提升
        // var命令会发生“变量提升”现象，即变量可以在声明之前使用，值为undefined。这种现象多多少少是有些奇怪的，按照一般的逻辑，变量应该在声明语句之后才可以使用。
        // 为了纠正这种现象，let命令改变了语法行为，它所声明的变量一定要在声明后使用，否则报错。

        // console.log(song);//输出 undefined
        // var song = '恋爱达人'

        // console.log(song);//error
        // let song = '恋爱达人'

        // 4.不影响作用域链
        {
            let school = 'abc';
            function fn(){
                console.log(school);
                // 函数内部没有school变量,所以向上一级找school变量，let不影响作用域链效果
            }
            fn();//输出abc
        }

    </script>
</body>
</html>